package ProyectoX.Source;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Point;
import java.util.Random;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextPane;

import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;

import ProyectoX.Source.Disparos.AutoBorrar;
import ProyectoX.Source.Disparos.Disparo;
import ProyectoX.Source.Disparos.hiloDisparoBoss;
import ProyectoX.Source.Disparos.hiloDisparoEnemigo;
import ProyectoX.Source.Movimientos.Motor;
import ProyectoX.Source.Movimientos.MovimientosTeclado;
import ProyectoX.Source.Naves.BigBoss;
import ProyectoX.Source.Naves.Clinkz;
import ProyectoX.Source.Naves.Nave;
import ProyectoX.Source.Naves.NaveEnemiga;
import ProyectoX.Source.Naves.NaveJugador;
import ProyectoX.Source.Naves.Sven;
import ProyectoX.Source.PowerUps.PowerUp;

import ProyectoX.Score.Scorer;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class GuiJuego extends javax.swing.JFrame {
	private JPanel PanelJuego;
	private JPanel PanelMenu;
	private JLabel labelFondo;
	private JButton BotonAyuda;
	private JLabel labelFondoMenu;
	private JLabel nota1;
	private JLabel bombas;
	private JLabel nota2;
	private JLabel vida;
	private JPanel fondoMenu;
	private JPanel Fondo;
	private JLabel Puntos;
	private JButton BotonSalir;
	
	private MovimientosTeclado movimientosTeclado;
	
	private NaveJugador jLabelDelJugador;
	private Disparo disparoJugador;
	
	private Juego juego;

	
	public GuiJuego(int pj){
		int player = pj;
		if (player == 1)
			jLabelDelJugador = new Clinkz();
		else
			jLabelDelJugador = new Sven();
		juego = new Juego(jLabelDelJugador,this);
		initGUI();
		initGame();
	}
	
	/**
	 * Inicia el hilo asociado al movimiento del jugador y el hilo que controla el juego. 
	 */
	private void initGame() {
		//ACA SE PREPARA EL TECLADO
		movimientosTeclado = new MovimientosTeclado(); 
		movimientosTeclado.setJuego(this); 
		movimientosTeclado.setNave(jLabelDelJugador); 
		
		movimientosTeclado.setLogica(juego);
		movimientosTeclado.jugar();
		
		this.addKeyListener(movimientosTeclado); 
		
		//Hilo que mueve la nave
		Motor motor= new Motor(); 
		motor.setJuego(this); 
		motor.setNave(jLabelDelJugador); 
		
		motor.setLogica(juego);
		motor.jugar();
		
		//ACA SE PREPARAN LOS MOVIMIENTOS DE LAS NAVES ENEMIGAS
		juego.comenzar();
	}
	
	/**
	 * Inicia la grafica del juego
	 */
	private void initGUI() {
		try {
			{
				getContentPane().setLayout(null);
				this.setPreferredSize(new java.awt.Dimension(500, 600));
				this.setSize(500, 600);
				this.setTitle("Proyecto X - By Guido Kestel");
				this.setResizable(false);
				this.addWindowListener(new WindowAdapter() {
					public void windowClosing(WindowEvent evt) {
						cerrarVentana(evt);
					}
				});
			}
			{
				PanelJuego = new JPanel();
				getContentPane().add(PanelJuego, "Center");
				//PanelJuego.setBounds(0, 70, 484, 486);
				PanelJuego.setBounds(0, 70, 500, 600);
				PanelJuego.setBackground(new java.awt.Color(128,128,128));
				PanelJuego.setLayout(null);
				PanelJuego.setOpaque(false);
				{
					PanelJuego.add(jLabelDelJugador);
				}
			}
			{
				PanelMenu = new JPanel();
				getContentPane().add(PanelMenu);
				PanelMenu.setBounds(0, 0, 500, 70);
				PanelMenu.setBackground(new java.awt.Color(128,128,128));
				PanelMenu.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
				PanelMenu.setLayout(null);
				{
					vida = new JLabel();
					PanelMenu.add(vida);
					vida.setText(""+jLabelDelJugador.getVida());
					vida.setBounds(145, 37, 41, 20);
					vida.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
					vida.setForeground(new java.awt.Color(255,0,0));
				}
				{
					nota1 = new JLabel();
					PanelMenu.add(nota1);
					nota1.setText("VIDA:");
					nota1.setBounds(107, 35, 40, 23);
					nota1.setFont(new java.awt.Font("Segoe UI",1,12));
				}
				{
					nota2 = new JLabel();
					PanelMenu.add(nota2);
					nota2.setText("BOMBAS:");
					nota2.setBounds(209, 38, 66, 16);
					nota2.setFont(new java.awt.Font("Segoe UI",1,12));
				}
				{
					bombas = new JLabel();
					PanelMenu.add(bombas);
					actualizarBombas();
					bombas.setBounds(272, 37, 18, 19);
					bombas.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
					bombas.setForeground(new java.awt.Color(255,0,0));
					bombas.setFont(new java.awt.Font("Segoe UI",1,12));
				}
				{
					BotonAyuda = new JButton();
					PanelMenu.add(BotonAyuda);
					BotonAyuda.setText("AYUDA");
					BotonAyuda.setBounds(13, 13, 81, 25);
					BotonAyuda.setFocusable(false);
					BotonAyuda.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							BotonAyudaActionPerformed(evt);
						}
					});
				}
				{
					BotonSalir = new JButton();
					PanelMenu.add(BotonSalir);
					BotonSalir.setText("SALIR");
					BotonSalir.setBounds(393, 13, 69, 42);
					BotonSalir.setFocusable(false);
					BotonSalir.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							BotonSalirActionPerformed(evt);
						}
					});
				}
				
				{
					Puntos = new JLabel();
					PanelMenu.add(Puntos);
					Puntos.setText(""+juego.puntaje());
					Puntos.setBounds(119, 7, 206, 23);
					Puntos.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
				}
				{
					fondoMenu = new JPanel();
					PanelMenu.add(fondoMenu);
					fondoMenu.setBounds(1, 1, 500, 68);
					fondoMenu.setLayout(null);
					{
						labelFondoMenu = new JLabel();
						fondoMenu.add(labelFondoMenu);
						labelFondoMenu.setBounds(0, 0, 500, 68);
						labelFondoMenu.setIcon(new ImageIcon(getClass().getClassLoader().getResource("ProyectoX/Imagenes/DestinyPSExclusiveOutrageousFortune.jpg")));
					}
				}
			}
			{
				Fondo = new JPanel();
				getContentPane().add(Fondo);
				Fondo.setBounds(0, 70, 500, 600);
				Fondo.setLayout(null);
				{
					labelFondo = new JLabel();
					Fondo.add(labelFondo);
					labelFondo.setBounds(0, 0, 500, 600);
					labelFondo.setIcon(new ImageIcon(getClass().getClassLoader().getResource("ProyectoX/Imagenes/universo.jpg")));
				}
			}

		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Grafica el disparo del jugador.
	 */
	public void graficaDisparo(){
		disparoJugador = jLabelDelJugador.disparar();
		PanelJuego.add(disparoJugador);
		
		disparoJugador.acomodar(); //Setea las Bounds del label
		
		AutoBorrar ab = new AutoBorrar(disparoJugador,PanelJuego,500);
		ab.start();
	}
	
	/**
	 * Grafica los disparos lanzados aleatoriamente por las naves enemigas comunes.
	 * @param n Nave a la que le corresponde el disparo
	 */
	public void graficaDisparoEnemigo(Nave n){
		Random azar = new Random();
		int num = azar.nextInt(50);
		if (num == 0){
			Disparo disp = n.disparar().clon();
			PanelJuego.add(disp);
			hiloDisparoEnemigo hilo = new hiloDisparoEnemigo(disp);
			
			hilo.setJuego(this);
			hilo.setNave(n);
			hilo.setLogica(juego);
			hilo.preparar();
			hilo.jugar();
		}
	}
	
	/**
	 * Grafica el arma primaria y secundaria de la nave Jefe.
	 * Tanto la primaria como la secundaria se "Disparan aleatoriamente"
	 * @param n La nave jefe que dispara.
	 */
	public void graficaDisparoBoss(Nave n){
		Random azar = new Random();
		int num = azar.nextInt(30);
		int num2 = azar.nextInt(30);
		if (num == 0){
			Disparo disp = n.disparar().clon();
			PanelJuego.add(disp);
			hiloDisparoEnemigo hilo = new hiloDisparoEnemigo(disp);
			
			hilo.setJuego(this);
			hilo.setNave(n);
			hilo.setLogica(juego);
			
			int px = n.getLocation().x+n.getWidth()/2;
			int py = n.getLocation().y+n.getHeight();
			disp.setBounds(px, py, 24, 28);
			
			hilo.jugar();
		}
		if (num == 1 && num2 > 22){
			Disparo dispIzq = ((BigBoss)n).dispararSecundaria().clon();
			Disparo dispDer = ((BigBoss)n).dispararSecundaria().clon();
			PanelJuego.add(dispIzq);
			PanelJuego.add(dispDer);
			hiloDisparoBoss hilo = new hiloDisparoBoss(dispIzq);
			hiloDisparoBoss hilo2 = new hiloDisparoBoss(dispDer);
			
			hilo.setJuego(this); hilo2.setJuego(this);
			hilo.setNave(n); hilo2.setNave(n);
			hilo.setLogica(juego); hilo2.setLogica(juego);
			hilo.preparar(); hilo2.preparar2();
			hilo.jugar(); hilo2.jugar();
		}
	}
	
	/**
	 * Retorna la nave del jugador.
	 * @return Un objeto de tipo NaveJugador
	 */
	public NaveJugador getJugador(){
		return jLabelDelJugador;
	}
	
	/**
	 * Remueve la nave del jugador del panel que contiene el juego.
	 */
	public void sacarJugador(){
		//Animacion de la explosion
			Point p = jLabelDelJugador.getLocation();
			JLabel explosion = new JLabel();
			explosion.setIcon(new ImageIcon(getClass().getClassLoader().getResource("ProyectoX/Imagenes/gifExplo.gif")));
			PanelJuego.add(explosion);
			explosion.setBounds(p.x, p.y, 71, 100);
			AutoBorrar ab = new AutoBorrar(explosion,PanelJuego,500);
			ab.start();
				
		//Borra la nave del panel
			PanelJuego.remove(jLabelDelJugador);
	}
	
	/**
	 * Remueve una nave enemiga del panel que contiene el juego.
	 * @param n
	 */
	public void sacarNave(NaveEnemiga n){
		//Animacion de la explosion
		Point p = n.getLocation();
		JLabel explosion = new JLabel();
		explosion.setIcon(new ImageIcon(getClass().getClassLoader().getResource("ProyectoX/Imagenes/gifExplo.gif")));
		PanelJuego.add(explosion);
		explosion.setBounds(p.x, p.y, 71, 100);
		AutoBorrar ab = new AutoBorrar(explosion,PanelJuego,300);
		ab.start();
		
		//Borra la nave del panel
		PanelJuego.remove(n);
		
		//Tira (o no) un powerup
		Random x = new Random();
		int aleatorio = x.nextInt(8); 
		if (aleatorio == 1){
			PowerUp pow = n.getPowerUp();
			PanelJuego.add(pow);
			pow.acomodar(n);
			juego.insertPowerUp(pow);
		}
	}
	
	/**
	 * Remueve un disparo del panel que contiene los elementos del juego
	 * @param d Un objeto de tipo disparo creado por una nave.
	 */
	public void sacarDisparo(Disparo d){
		PanelJuego.remove(d);
	}
	
	/**
	 * Actualiza en su label asociado, el valor del puntaje de la logica del juego.
	 */
	public void actualizarPuntaje(){
		Puntos.setText(""+juego.puntaje());
	}
	/**
	 * Actualiza en su label asociado, la vida del jugador.
	 */
	public void actualizarVida(){
		vida.setText(""+jLabelDelJugador.getVida());
	}
	/**
	 * Actualiza en su label asociado, la cantidad de bombas que almacena el jugador.
	 */
	public void actualizarBombas(){
		bombas.setText(""+jLabelDelJugador.cantBombas());
	}
	
	/**
	 * Remueve un powerUp del panel que contiene el juego
	 * @param p Un powerUp presente en pantalla
	 */
	public void sacarPower(PowerUp p){ 
		PanelJuego.remove(p);
		actualizarPuntaje();
		actualizarVida();
		actualizarBombas();
	}
	
	/**
	 * Muestra la animacion asociada a la bomba arrojada por el jugador.
	 */
	public void animacionBomba(){
		Point p = jLabelDelJugador.getLocation();
		JLabel explosion = new JLabel();
		explosion.setIcon(new ImageIcon(getClass().getClassLoader().getResource("ProyectoX/Imagenes/bombatr.gif")));
		PanelJuego.add(explosion);
		explosion.setBounds(p.x-195, p.y-185, 480, 480);
		AutoBorrar ab = new AutoBorrar(explosion,PanelJuego,2500);
		ab.start();
	}
	
	/**
	 * Agrega una nave al panel del juego
	 * @param n Un objeto de tipo Nave
	 */
	public void agregarNave(Nave n){
		PanelJuego.add(n);
	}
	
	/**
	 * Agrega al panel del juego un PowerUp
	 * @param pow El PowerUp a agregar
	 * @param x La cooredenada X del panel donde se insertara el powerup
	 * @param y La cooredenada Y del panel donde se insertara el powerup
	 */
	public void agregarPowerUp(PowerUp pow, int x, int y){
		PanelJuego.add(pow);
		pow.setBounds(x, y, 32, 26);
		juego.insertPowerUp(pow);
	}
	
	/**
	 * Oyente asociado al boton SALIR
	 * @param evt
	 */
	private void BotonSalirActionPerformed(ActionEvent evt) {
		cerrarTodo();
	}
	
	/**
	 * Oyente asociado al boton X
	 * @param evt
	 */
	private void cerrarVentana(WindowEvent evt) {
		cerrarTodo();
	}
	
	/**
	 * Cierra el Main y todo proceso iniciado por el mismo.
	 */
	private void cerrarTodo() {
		this.dispose();
		System.exit(0);
		
	}
	
	/**
	 * Muestra en pantalla el panel que contiene el TOP 5 (una vez finalizado el juego)
	 * @param puntaje El puntaje obtenido por el jugador.
	 */
	public void pantallaFinal(int puntaje){
		PanelJuego.removeAll();
		Puntos.setVisible(false);
		vida.setVisible(false);
		PanelJuego.repaint();
		
		crearPanelScore(puntaje);
		PanelJuego.repaint();
		
	}
	
	/**
	 * Le pregunta el nombre al jugador para posteriormente insertarlo en el archivo de puntajes.
	 * Crea la tabla de posiciones con los 5 mejores puntajes.
	 * @param ptos El puntaje obtenido por el jugador.
	 */
	private void crearPanelScore(int ptos){
		
		Scorer top = new Scorer();
		String s = JOptionPane.showInputDialog("Ingrese su nombre: ");
		if (s.length() > 10)
			s = s.substring(0, 10);
		top.guardarPuntaje(s, ptos);
		
		JPanel panel = new JPanel();
		panel.setBounds(50, 50, 400, 400);
		panel.setOpaque(false);
		
		JTextPane texto = new JTextPane();
		texto.setFont(new java.awt.Font("Bernard MT Condensed",0,36));
		texto.setForeground(new java.awt.Color(255,255,255));
		texto.setBounds(0, 0, 400, 400);
		texto.setOpaque(false);
		texto.setEditable(false);
		texto.setText("TOP Players: \n "+top.toString(5));
		
		
		panel.add(texto);
		
		PanelJuego.add(panel);
	}
	
	/**
	 * Muestra los controles del juego.
	 * @param evt
	 */
	private void BotonAyudaActionPerformed(ActionEvent evt) {
		JOptionPane.showMessageDialog(null,"Movimientos de la nave: teclas ← ↑ → ↓", "Mensaje", JOptionPane.INFORMATION_MESSAGE);
		JOptionPane.showMessageDialog(null,"Disparo: Tecla A", "Mensaje", JOptionPane.INFORMATION_MESSAGE);
		JOptionPane.showMessageDialog(null,"Bomba: Tecla B", "Mensaje", JOptionPane.INFORMATION_MESSAGE);
	}
	

}
